/***************************************************************************
 * COPYRIGHT NOTICE
 * Copyright 2022 Horizon Robotics, Inc.
 * All rights reserved.
 ***************************************************************************/

#include "sensor_ov10635_config.h"

#define F_WIDTH  1280
#define F_HEIGHT 720

MIPI_SENSOR_INFO_S SENSOR_4LANE_OV10635_12BIT_YUV422_INFO = {
    .deseEnable = 1,              // 该 sensor 是否有 serdes（串解器）
    .inputMode = INPUT_MODE_MIPI, // sensor 接入方式,mipi还是dvp
    .deserialInfo = {
        .bus_type = 0,
        .bus_num = 4,
        .deserial_addr = 0x3d,
        .deserial_name = "s954",
    },
    .sensorInfo = {
        .port = 0,                       // sensor的逻辑编号，必须从0开始
        .dev_port = 0,                   // 每路 sensor 操作的驱动节点，一个驱动支持多个节点.
                                         // snsinfo中的dev_port必须等于pipeId，多目摄像头设置的时候需要特别注意
        .bus_type = 0,                   // 访问总线类型， 0 是 i2c,1是spi
        .bus_num = 4,                    // 总线号，根据具体板子硬件原理图确定
        .fps = 30,                       // 帧率，用来选择使用哪一组帧率的sensor参数
        .resolution = F_HEIGHT,          // sensor 行数, 必须要和mipi属性配置一致
        .sensor_addr = 0x40, // sensor i2c 设备地址
        .serial_addr = 0x1c,
        .entry_index = 1,         // sensor 使用的 mipi 索引, 0~3，对应mipi host的序号
        .sensor_mode = NORMAL_M,  // sensor 工作模式， 1是normal,2 是dol2, 3是dol3
        .reg_width = 16,          // sensor 寄存器地址宽度
        .sensor_name = "ov10635", // sensor的名字，在libcam.so中会根据这个名字组合出libov10635.so
        .extra_mode = 0,          // 0: single ov10635 + max9296 1: dual + max9296 2: single + max96712 3: quad + max96712
        .deserial_index = 0,
        .deserial_port = 0,
        .gpio_num = 0,
    },
};

MIPI_ATTR_S MIPI_4LANE_OV10635_12BIT_YUV422_ATTR = {
    .mipi_host_cfg = {
        .lane = 2,           // 硬件上sensor用了几个mipi数据lane，ov10635用的1 lane, os8a10 4K的用了4 lane
        .datatype = 0x1e,    // sensor的输出数据类型，请参考 《X3J3平台AIOT媒体系统接口手册.pdf》第3.5.36节 DATA TYPE
        .mclk = 24,          // mipi 模块主时钟，目前默认是24MHz
        .mipiclk = 1600, // sensor 输出总的 mipibit rate, 单位Mbits/秒
        .fps = 30,           // sensor 输出实际帧率, 和 MIPI_SENSOR_INFO_S 是什么关系？
        .width = F_WIDTH,    // sensor实际输出的分辨率，一般根据sensor供应商的配置参数配置就行
        .height = F_HEIGHT,
        .linelenth = 3207,  // sensor 输出带 blanking 的总行长， 一般根据sensor供应商的配置参数配置就行
        .framelenth = 748, // sensor 输出带 blanking的总行数
        .settle = 30,       // sensor 输出实际Ttx-zero + Ttx-prepare时间（ clk 为单位）, 范围从0-127，常用的值是20，30，40，50，60，65
        .channel_num = 1,   // 使用虚通道的个数, linear 用一个，dol2 用 2 个， dol3 用3个
        .channel_sel = {0}  // 保存每个虚通道的值，在调用HB_VIN_SetDevVCNumber接口时用第一个，调用HB_VIN_AddDevVCNumber用后面的2 3 4的配置
    },
    .dev_enable = 0 // mipi dev 是否使能， 1是使能， 0 是关闭, 只用开启mipi bypass的开启
};

VIN_DEV_ATTR_S DEV_ATTR_4LANE_OV10635_12BIT_YUV422_BASE = {
    .stSize = {
        // 输入的数据
        .format = 8,        // 像素格式，format 为 0代表是raw, 根据 pixel_lenght 来表示究竟是 raw8, raw12 还是 raw16; 8: yuv422
        .width = F_WIDTH,   // 数据宽
        .height = F_HEIGHT, // 数据高
        .pix_length = 0     // format=0表示raw  pix_length= 0-raw8 1-raw10 2-raw12
    },
    .mipiAttr = {
        // sif(dev) 输入的接口模式， mipi or dvp,目前都是 mipi
        .enable = 1,               // mipi 使能 ,0 是关闭， 1 是使能
        .ipi_channels = 1,         // sif和isp之间的硬件通道，可以把多个mipi虚拟通道合并到这一个ipi channel中，ipi_channels 表示用了几个 channel ，默认是 0 开始，如果设置是 2 ，是用了 0 ，1
        .ipi_mode = 1,             // 当 DOL2 分成两路 linear 或者 DOL3 分成一路 DOl2 和一路 linear 或者三路linear 的时候，此值就赋值为 2 或 3.
        .enable_mux_out = 1,       // 未用
        .enable_frame_id = 1,      // 是否使能 frameid, 是否做智能的时候要用？
        .enable_bypass = 0,        // 使能mipi host到mipi dev的bypass
        .enable_line_shift = 0,    // 未用
        .enable_id_decoder = 0,    // 未用
        .set_init_frame_id = 1,    // 初始 frame id 值一般为 1
        .set_line_shift_count = 0, // 未用
        .set_bypass_channels = 1,  // 未用
        .enable_pattern = 0,       // 是否使能 testpartern
    },
    .DdrIspAttr = {
        // isp(pipe) 的输入属性配置， offline 或者是回灌
        .buf_num = 6,         // 回灌的存储数据的 buf 数目
        .raw_feedback_en = 0, // 使能回灌模式，不能和 offline 模式同时开启，独立使用
        .data = {
            // 数据格式同 VIN_DEV_SIZE_S
            .format = 8,
            .width = F_WIDTH,
            .height = F_HEIGHT,
            .pix_length = 0,
        },
    },
    .outDdrAttr = {
        // sif(dev) 的输出到 ddr 配置
        .stride = 1280/*F_WIDTH * 3 / 2*/, // 硬件 stride 跟格式匹配，通过行像素根据raw数据bit位数计算得来（而且结果要32对齐），8bit：x1, 10bit: x1.25 12bit: x1.5,例ov10635 raw10，1920 x 1.25 = 2400
        .buffer_num = 8,           // dev 输出到 ddr 的 buf 个数，最少可设置为6
        .frameDepth = 0,           // 默认不配置最多 get 的帧数 , buffer_num 是总 buff数量，建议 frameDepth 值最大是ddrOutBufNum - 4
    },
    .outIspAttr = {
        // sif 到 isp 一些属性设置
        .dol_exp_num = 1,      // 曝光模式， 1 为普通模式， dol 2 或者 3设置对应数目
        .enable_dgain = 0,     // ISP 内部调试参数，暂可忽略
        .set_dgain_short = 0,  // ISP 内部调试参数，暂可忽略
        .set_dgain_medium = 0, // ISP 内部调试参数，暂可忽略
        .set_dgain_long = 0,   // ISP 内部调试参数，暂可忽略
        .vc_short_seq = 0,     // 用来描述 DOL2/3 模式下，短帧的顺序
        .vc_medium_seq = 0,    // 用来描述 DOL2/3 模式下，普通帧的顺序
        .vc_long_seq = 0,      // 用来描述 DOL2/3 模式下，长帧的顺序
    },
};

VIN_PIPE_ATTR_S PIPE_ATTR_4LANE_OV10635_12BIT_YUV422_BASE = {
    .ddrOutBufNum = 6,             // ISP->GDC ddr的buf数量，最少可以设置成 2
    .snsMode = SENSOR_NORMAL_MODE, // sensor 工作模式，要和MIPI_SENSOR_INFO_S配置的sensor_mode一致
    .stSize = {
        // 数据格式同 VIN_DEV_SIZE_S
        .format = 0,
        .width = F_WIDTH,
        .height = F_HEIGHT,
    },
    .cfaPattern = PIPE_BAYER_RGGB, // 数据格式布局(sensor输出的图像格式是RGGB还是BGGR),和sensor保持一致，查sensor数据手册可知
    .temperMode = 0,               // 时序降噪模式，2代表2帧融合，3代表3帧融合
    .ispBypassEn = 0,              // 是否使能 isp 的 bypass, sensor必须支持输出yuv
    .ispAlgoState = 1,             // 是否启动 3a 算法库 ,1 是启动， 0 是关闭
    .bitwidth = 12,                // raw图位宽，有效值 8、10、12 、14、16、20
    .calib = {
        // 是否开启 sensor 矫正数据加载，1 是开启，0 是关闭。ISP使用这些数据
        .mode = 5,                      // 是否开启 sensor 矫正数据加载
        .lname = "libar0233_linear.so", // 对应使用的校准库
    },
};

VIN_DIS_ATTR_S DIS_ATTR_OV10635_BASE = {
    .picSize = {
        .pic_w = F_WIDTH - 1,
        .pic_h = F_HEIGHT - 1,
    },
    .disPath = {
        .rg_dis_enable = 0,
        .rg_dis_path_sel = 1,
    },
    .disHratio = 65536,
    .disVratio = 65536,
    .xCrop = {
        .rg_dis_start = 0,
        .rg_dis_end = F_WIDTH - 1,
    },
    .yCrop = {
        .rg_dis_start = 0,
        .rg_dis_end = F_HEIGHT - 1,
    },
};

VIN_LDC_ATTR_S LDC_ATTR_OV10635_BASE = {
    .ldcEnable = 0,
    .ldcPath = {
        .rg_y_only = 0,
        .rg_uv_mode = 0,
        .rg_uv_interpo = 0,
        .reserved1 = 0,
        .rg_h_blank_cyc = 32,
        .reserved0 = 0,
    },
    .yStartAddr = 786432,
    .cStartAddr = 1081344,
    .picSize = {
        .pic_w = F_WIDTH - 1,
        .pic_h = F_HEIGHT - 1,
    },
    .lineBuf = 99,
    .xParam = {
        .rg_algo_param_b = 1,
        .rg_algo_param_a = 1,
    },
    .yParam = {
        .rg_algo_param_b = 1,
        .rg_algo_param_a = 1,
    },
    .offShift = {
        .rg_center_xoff = 0,
        .rg_center_yoff = 0,
    },
    .xWoi = {
        .rg_start = 0,
        .reserved1 = 0,
        .rg_length = F_WIDTH - 1,
        .reserved0 = 0,
    },
    .yWoi = {
        .rg_start = 0,
        .reserved1 = 0,
        .rg_length = F_HEIGHT - 1,
        .reserved0 = 0,
    },
};
